/*
 * 基础库声明及函数原形说明
 * 
 * 最后修改: 2006年12月1日星期五
 * 文曦畅
 *
 * 历史:
 */

#ifndef __BASE_H__
#define __BASE_H__

#include <SDL.h>
#include <SDL_ttf.h>
#include <SDL_mixer.h>

typedef SDL_Surface* Image;
typedef TTF_Font* Font;

/*	初始化资源路径, 视频, 音频, 控制, 字体
	参数: path_prefix 指定数据初始路径
	返回: 非0失败
 */
int	all_init		(char *path_prefix);

/*	视频初始化, 使用all_init代替
	返回: 非0失败
 */
int	video_init		();

/*	指示绘图操作的开始及结束, 在这两个函数中调用画图函数
	才能真正有效
 */
void	video_start_draw	();
void	video_end_draw		();

/*	清屏
 */
void	video_clear		();

/*	基本绘图
 */
void	video_put_pixel		(int x, int y);
void	video_line		(int x1, int y1, int x2, int y2);
void	video_circle		(int sx, int sy, int r);
void	video_set_color		(Uint8 R, Uint8 G, Uint8 B);
void	video_set_bkcolor	(Uint8 R, Uint8 G, Uint8 B);
void	video_rectangle		(int x1, int y1, int x2, int y2);
void	video_bar		(int x1, int y1, int x2, int y2);
void	video_poly_start	();
void	video_poly_point	(int x, int y);
void	video_poly_end		();

void	video_set_screen	(Image img);
void	video_reset_screen	();
Image	video_create_image	(int width, int height);
void	video_set_alpha		(Image a, Uint8 alpha);

/*	设置窗口标题
	参数: cap为标题
 */
void	video_set_caption	(char *cap);

/*	对屏幕进行更新/清除, 范围为限定矩形
 */
void	video_end_rect		(int x1, int y1, int x2, int y2);
void	video_clear_rect	(int x1, int y1, int x2, int y2);

/*	控制初始化, 使用all_init代替
	返回: 非0失败
 */
int	ctrl_init		();

/*	从队列中处理事件
	返回: 0, 没有发生事件, 其它值或能为SDL_KEYDOWN, SDL_KEYUP...
 */
int	ctrl_do_event		();

/*	在一个正常的事件周期里取处事件其它信息
 */
int	ctrl_get_key		();
int	ctrl_get_mouse		(int *x, int *y);
int	ctrl_get_botton		();
Uint16	ctrl_get_unicode	();

struct Timer {
	int enabled;
	int interval;
	int lasttime;
};

/*	时间创建, 设置, 测试(被动定时), 销毁
 */
struct Timer *	ctrl_create_timer	();
int		ctrl_set_timer		(struct Timer *t,
					 unsigned int intv, int en);
int		ctrl_test_timer		(struct Timer *t);
void		ctrl_destory_timer	(struct Timer *t);

/*	读取图片
	filename必需是相对于ipath的路径, alpha指定对图片进行半透明
 */
Image	video_loadimg		(char *filename);
Image	video_loadimg_x		(char *filename, Uint8 alpha);

/*	图片绘制
	sx, sy为图片起始位置,wh指定长宽, x, y是屏幕坐标
 */
void	video_drawimg		(Image img, int x, int y);
void	video_drawimg_x		(Image img, int sx, int sy,
				 int w, int h, int x, int y);
void	video_destory_img	(Image a);

/*	旋转一定的角度绘图
 */
void	video_rotate_draw	(Image img, int sx, int sy, int angle);

/*	旋转缩放一张图片, 并生成另外一张
 */
Image	img_adv_rotate		(Image src, int angle);
Image	img_adv_zoom		(Image src, double xscale, double yscale);

void	img_adv_set_alpha	(Image img, Uint8 alpha);
int	img_get_width		(Image img);
int	img_get_height		(Image img);

/*	建议用all_init进行初始化
 */
int		ttf_init		();

/*	以size大小读入字体文件, 受ipath处理
 */
Font		ttf_load		(char *name, int size);
void		ttf_free		(Font f);

/*	将字串使用字全渲染成图片
 */
Image		ttf_make_img		(Font font, char *utf8_str, Uint32 color);

/*	设置字体处种属性, 注意是叠加的
 */
void		ttf_set_bold		(Font font);
void		ttf_set_italic		(Font font);
void		ttf_set_underline	(Font font);
void		ttf_set_normal		(Font font);


struct Audio_sample {
	Mix_Chunk *sample;
	int channel_used;
};

/*	建议使用all_init
	返回非0失败
 */
int			audio_init	();

/*	读取音频文件
 */
struct Audio_sample *	audio_load	(char *file);

/*	播放音频文件
	参数: loop指定循环次数
 */
int			audio_play	(struct Audio_sample *sample, int loop);
void			audio_pause	(struct Audio_sample *sample);
void			audio_resume	(struct Audio_sample *sample);
void			audio_stop	(struct Audio_sample *sample);
void			audio_free	(struct Audio_sample *sample);
int			audio_is_playing(struct Audio_sample *sample);

/*	使用all_init代替
 */
void		respath_init	(char *path);

/*	得到资源路径, 使用ipath_init指定的
 */
const char *	respath_get	();

#endif
